package cn.biplam.common.wrapper;

import java.io.Serializable;
 
/**
 * 2维表格类,表格为二维数组，单元格数据类型在对象实例化时用户定义 
 * @author XiaoRuxing
 * @create 5:30:29 PM
 * @version 1.0
 */

public class D2Table<T> implements Serializable{
	private static final long serialVersionUID = -374646687490101375L;//类序列号	
	private T[][] 	sTable; //存储2维数据的容器
	private int iRowCount=0;//行数
	private int iColCount=0;//列数
	private int iMaxColCount=0; //最大列数
	
	/**
	 * 传入行数和列数的构造函数
	 * @param iRowCount	行数
	 * @param iColCount	列数
	 */
	@SuppressWarnings("unchecked")
	public D2Table(int iRowCount,int iColCount){
		this.iRowCount=iRowCount;
		this.iColCount=iColCount;
		this.iMaxColCount=iColCount;
		sTable = (T[][])new Object[iRowCount][iColCount];
	}
	
	/**
	 * 只有行数的构造函数
	 * @param iRowCount 行数
	 */
	@SuppressWarnings("unchecked")
	public D2Table(int iRowCount){
		this.iRowCount=iRowCount;
		sTable = (T[][])new Object[iRowCount][];
	}
	
	/**
	 * 在行号为iRowNumber列号为iColNumber的单元存入数据sValue	
	 * @param iRowNumber 行号
	 * @param iColNumber 列号
	 * @param sValue	值
	 * @return
	 */
	public void put(int iRowNumber,int iColNumber,T sValue) throws ErrorMessage{

		/** 如果下标越界抛出异常 */
		if(iRowNumber>=this.iRowCount||iColNumber>=this.iColCount){
			throw new ErrorMessage("下标越界");
		}else{
			sTable[iRowNumber][iColNumber]=sValue;			
		}
	}
	
	/**
	 * 在第iRowNumber行存入数据sValue
	 * @param iRowNumber 行号
	 * @param sValue	 值
	 * @return
	 */
	public void put(int iRowNumber,T [] sValue) throws ErrorMessage{
		
		/** 如果下标越界抛出异常 */
		if(iRowNumber>=this.iRowCount){
			throw new ErrorMessage("下标越界");
		}else{
			if(sValue.length>this.iMaxColCount)
				this.iMaxColCount=sValue.length;
			sTable[iRowNumber]=sValue;			
		}
	}
 
	/**
	 * 返回表格的行数
	 * @return 行数
	 */
	public int getTableRowNumber(){
		return this.iRowCount;
	}
	
	/**
	 * 返回最大列长度	
	 * @return 最大列长度
	 */
	public int getTableMaxColNumber(){
		return this.iMaxColCount;
	}
	
	/**
	 * 返回表格单元格个数	
	 * @return 单元格个数
	 */
	public int getTableUnitNumber(){
		int iUnitCount=0;
		if(this.iColCount>0){
			for(int i=0;i<this.iRowCount;i++){
				int iCurColLength=sTable[i].length;
				  iUnitCount= iUnitCount+iCurColLength;
			}			
		}
		return iUnitCount;
	}
	
	/**
	 * 返回单元格值
	 * @param iRowNumber 行
	 * @param iColNumber 列	
	 * @return           单元格值
	 */
	public T getUnitValue(int iRowNumber,int iColNumber) throws ErrorMessage{		
	
		T result=null;
		
		/** 如果下标越界抛出异常 */
		if(iRowNumber>=this.iRowCount||iColNumber>=this.iMaxColCount){
			throw new ErrorMessage("下标越界");
		}else{
			result=(T)sTable[iRowNumber][iColNumber];					
		}
		
		return result;
	}
	
	/**
	 * 返回得iRowNumber对应行
	 * @param iRowNumber 行
	 * @return			行数组
	 */
	public T[] getRow(int iRowNumber) throws ErrorMessage{
		
		/** 如果下标越界抛出异常 */		
		if(iRowNumber>=this.iRowCount){
			throw new ErrorMessage("下标越界");
		}else{
			return (T[])sTable[iRowNumber];			
		}
	}
	
}
